package com.example.projecth.runhelper;

import java.util.LinkedList;

import android.content.Context;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.example.projecth.R;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

public class MainActivity extends FragmentActivity {		
	
	private MediaPlayer mp;
	
	private GoogleMap map;	
	private LocationProvider provider;	
	private LocationManager manager;
	
	//Button, TextView 저장할 변수
	private Button start, close;
	private TextView moveDistance;
	
	//처음지점과 마지막지점을 저장할 Marker 변수
	private Marker firstPosition;
	private Marker lastPosition;
	
	//각 지점을 연결한 선을 저장할 변수
	private Polyline line;
	
	//Marker를 저장 할 LinkedList
	private LinkedList<Marker> markers;
	//LatLng를 저장 할 LinkedList
	private LinkedList<LatLng> latlng;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//사용할 layout 설정
		setContentView(R.layout.rs_main);
				
		//LinkedList 객체 선언
		markers = new LinkedList<Marker>();
		latlng = new LinkedList<LatLng>();
		
		//사용 할 위젯들 설정
		start = (Button)findViewById(R.id.start);
		close = (Button)findViewById(R.id.close);
		moveDistance = (TextView)findViewById(R.id.move_distance);
		
		//버튼에 listener 연결
		start.setOnClickListener(startBtn);
		close.setOnClickListener(closeBtn);
				
		manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		provider = manager.getProvider(LocationManager.GPS_PROVIDER);
		
		
		//fragment 설정
		SupportMapFragment fragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map_fragment);
		
		//맵 보여주기
		map = fragment.getMap();
		
		
		mp = new MediaPlayer();
		mp = MediaPlayer.create(this, R.raw.run);
		mp.setLooping(true);
		
		manager.requestLocationUpdates(provider.getName(), 0, 0, listener);
				
		//provider가 마지막으로 수신한 위치 정보
		Location loc = manager.getLastKnownLocation(provider.getName());
		LatLng location = null;
		//마지막으로 수신한 정보가 있다면,
		if (loc != null) {
		//지도에 현재 위치 표시
			location = new LatLng(loc.getLatitude(), loc.getLongitude());
		//마지막으로 수신한 정보가 없다면 아래 좌표를 수신 (마지막으로 수신한 정보가 없다면, null값을 받으면서 error발생 방지)
		} else {
			 location = new LatLng(37.499955, 127.032935);
		}
		//카메라 이동
		map.animateCamera(CameraUpdateFactory.newLatLngZoom(location, 17));
		
//		try {			
//			Thread.sleep(1000);
//			manager.removeUpdates(listener);
//		} catch (Exception ex) {}
		
	}
	
	@Override
	protected void onResume() {
		mp.start();
		super.onResume();
	}
	
	
	@Override
	protected void onPause() {
		manager.removeUpdates(listener);
		mp.pause();
		super.onPause();
	}
	
	@Override
	protected void onDestroy() {
		mp.release();
		super.onDestroy();
	}
	
	private LocationListener listener = new LocationListener() {
		
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {}
		@Override
		public void onProviderEnabled(String provider) {}
		@Override
		public void onProviderDisabled(String provider) {}			
				
		@Override //위치가 변할때 사용되는 메서드
		public void onLocationChanged(Location info) {	
			//변한 위치정보를 받아서 LatLng에 저장 
			LatLng location = new LatLng(info.getLatitude(), info.getLongitude());
			//LinkedList<LatLng>에 위치정보 추가
			manager.requestLocationUpdates(provider.getName(), 1000 * 30, 25, listener);
			latlng.add(location);
			//카메라 이동
			map.animateCamera(CameraUpdateFactory.newLatLngZoom(location, 17));

		}
	};	
	//기록시작 버튼 눌렀을때 listener
	private OnClickListener startBtn = new OnClickListener() {		
		@Override
		public void onClick(View v) {
			//버튼이름이 기록시작 일때						
			if (start.getText().equals("기록시작")) {
				//마지막지점 Marker가 있다면 시작,종료마커와 라인을 초기화				
				if (lastPosition != null ) {
					firstPosition.remove();
					lastPosition.remove();
					line.remove();
					moveDistance.setText("");
				}
				
				
				Location loc = manager.getLastKnownLocation(provider.getName());
				LatLng location = new LatLng(loc.getLatitude(), loc.getLongitude());
				//Marker 추가 및 설정
				firstPosition = map.addMarker(new MarkerOptions()
				.position(location)
				.icon(BitmapDescriptorFactory.fromResource(R.drawable.start))
				.title("START")
				.snippet("운동 시작 지점"));
				
				//버튼명을 기록중지로 바꾸기
				start.setText("기록중지");
				//LinkedList에 시작지점 마커 추가
				markers.add(firstPosition);				
				//카메라 이동
				map.animateCamera(CameraUpdateFactory.newLatLngZoom(location, 17));
				
				//manager.requestLocationUpdates(provider.getName(), 1000 * 30, 25, listener);

			//버튼이름이 기록중지 일때	
			} else if (start.getText().equals("기록중지")) {
				
				Location loc = manager.getLastKnownLocation(provider.getName());				
				LatLng location = new LatLng(loc.getLatitude(), loc.getLongitude());
				//Marker 추가 및 설정
				lastPosition = map.addMarker(new MarkerOptions()
				.position(location)
				.icon(BitmapDescriptorFactory.fromResource(R.drawable.end))
				.title("STOP")
				.snippet("운동 종료 지점"));
				//버튼명 기록시작으로 바꾸기
				start.setText("기록시작");
				//LinkedList에 종료지점 마커 추가
				markers.add(lastPosition);
				//카메라 이동
				map.animateCamera(CameraUpdateFactory.newLatLngZoom(location, 17));
				
				//시작 -> 이동 -> 종료 지점을 선으로 이어주기
				line = map.addPolyline(
					new PolylineOptions()
					//선두께
					.width(7)
					//선색깔
					.color(Color.RED)
					//시작지점의 위치값
					.add(firstPosition.getPosition())
					//이동지점의 위치값
					.addAll(latlng)
					//종료지점의 위치값
					.add(lastPosition.getPosition())					
				);
				
				float[] dis = new float[1];
				float total = 0;
				
				
				for (int i = 0; i < latlng.size() - 1; i++) {
					LatLng from = latlng.get(i);
					LatLng to = latlng.get(i+1);
					Location.distanceBetween(
						from.latitude, from.longitude, to.latitude, to.longitude, dis);
					
					total += dis[0];
								
				}				 
				 
				if (latlng != null)			
				moveDistance.setText(String.format("\t[이동한 거리 : %d(m)]", (int)total));
								
				//업데이트 중지
				manager.removeUpdates(listener);
				//초기화
				markers.removeAll(markers);
				latlng.removeAll(latlng);
			}
		}
	};
	
	//닫기버튼을 눌렀을때 실행되는 listener
	private OnClickListener closeBtn = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			//뒤로가기 키
			onBackPressed();
			
		}
	};
		
}

